SelectDirectory - umiestnenie
Otázka od: Kalus Jozef Ing.
25. 9. 2002 14:26
zdravim,
ked pouzijem na vyber adresara nieco taketo:
SelectDirectory('Vyber cestu:', '', StrDir);
tak mi to mrskne to male okienko kdesi vpravo dole, ale ja by som ho chcel
vycentrovane alebo mu chcel povedat kde ma byt umiestnene a to som akosi
nikde nenasiel, help je velmi strucny
dik za kazde info pripadne nakopnutie
joka
Odpovedá: Ondrej Kelle
25. 9. 2002 18:06
> ked pouzijem na vyber adresara nieco taketo:
>
> SelectDirectory('Vyber cestu:', '', StrDir);
>
> tak mi to mrskne to male okienko kdesi vpravo dole, ale ja by
> som ho chcel vycentrovane alebo mu chcel povedat kde ma
> byt umiestnene
Cau,
da sa to napriklad takto:
function SelectDirCB(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM):
Integer; stdcall;
var
R: TRect;
begin
if (uMsg = BFFM_INITIALIZED) then
begin
GetWindowRect(Wnd, R);
if Assigned(Application) and Assigned(Application.MainForm) then
with Application.MainForm do
SetWindowPos(Wnd, HWND_TOP, Left + (Width - (R.Right - R.Left)) div
2,
Top + (Height - (R.Bottom - R.Top)) div 2, 0, 0, SWP_NOOWNERZORDER
or SWP_NOSIZE or SWP_SHOWWINDOW);
if (lpData <> 0) then
SendMessage(Wnd, BFFM_SETSELECTION, Integer(True), lpdata);
end;
Result := 0;
end;
function SelectDirectory(const Caption: string; const Root: WideString; var
Directory: string): Boolean;
... kopia z FileCtrl
skratka to iste ako vo FileCtrl, akurat v tej callback funkcii pri sprave
BFFM_INITIALIZED si zmenis polohu toho dialogu.
HTH
TOndrej
Odpovedá: Richard Siegl
26. 9. 2002 9:24
Nazdar
ked je uz debata o SelectDirectory.... neviete niekto ako sa da aby bol uz
nejaky konkretny adresar vybrany ..... zmenou parametra root iba obmedzim
vyberovu strukturu a to nechcem
alebo nejaky vhodnejsi sposob (komponentu) vyberu adresaru ale musi tam byt
k dispozicii aj siet
Rickie
----- Original Message -----
From: "Ondrej Kelle" <O.Kelle@digitalpublishing.de>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, September 25, 2002 3:30 PM
Subject: RE: SelectDirectory - umiestnenie
> > ked pouzijem na vyber adresara nieco taketo:
> >
> > SelectDirectory('Vyber cestu:', '', StrDir);
> >
> > tak mi to mrskne to male okienko kdesi vpravo dole, ale ja by
> > som ho chcel vycentrovane alebo mu chcel povedat kde ma
> > byt umiestnene
>
> Cau,
> da sa to napriklad takto:
>
> function SelectDirCB(Wnd: HWND; uMsg: UINT; lParam, lpData: LPARAM):
> Integer; stdcall;
Odpovedá: Petr Brant
26. 9. 2002 11:06
Napsal jsem si na to tenhle unit, je tam k dispozici i sit (ale nezobrazi se
sitovy adresar, i kdyz existuje) a pokud existuje adresar InitialDirectory,
struktura se prislusne rozbali.
RNDr. Petr Brant [brant@dcomm.cz]
http://web.redbox.cz/petr.brant
D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234
unit BrowseDir;
interface
uses
Windows,
ShlObj, SysUtils, FileCtrl;
type TBrowseDirectory = class(TObject)
private
{ Private declarations }
public
{ Public declarations }
function BrowseForDirectory(OwnerWnd:THandle; InitialDirectory: string; var
SelectedDirectory:string):boolean;
end;
implementation
uses ActiveX;
var m_InitialDirectory:string;
function BrowseCallbackProc(Wnd: HWnd; Msg: UINT; lPar: LPARAM; lData:
LPARAM): integer; stdcall;
begin
Result := 0;
if (Msg = BFFM_INITIALIZED) and DirectoryExists(m_InitialDirectory) then
SendMessage(Wnd, BFFM_SETSELECTION, 1, LPARAM(m_InitialDirectory) );
end;
function TBrowseDirectory.BrowseForDirectory(OwnerWnd:THandle;
InitialDirectory: string; var SelectedDirectory:string):boolean;
var BrowseInfo: TBrowseInfo;
idRoot: PItemIDList;
Dir: PChar;
ShellMalloc: IMalloc;
begin
FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
begin
Dir:= ShellMalloc.Alloc(MAX_PATH);
try
m_InitialDirectory:=InitialDirectory;
BrowseInfo.hwndOwner:=OwnerWnd;
BrowseInfo.pidlRoot:=idRoot;
BrowseInfo.lpszTitle:='';
BrowseInfo.ulFlags:= BIF_RETURNONLYFSDIRS;
BrowseInfo.lpfn:=BrowseCallbackProc;
BrowseInfo.pszDisplayName:=Dir;
idRoot:=ShBrowseForFolder(BrowseInfo);
Result:=false;
if idRoot<>nil then
begin
SHGetPathFromIDList(idRoot, Dir);
SelectedDirectory:=string(Dir);
ShellMalloc.Free(idRoot);
Result:=(Length(SelectedDirectory)<>0);
end;
finally
ShellMalloc.Free(Dir);
end;
end;
end;
end.
Subject: Re: SelectDirectory - umiestnenie
Nazdar
ked je uz debata o SelectDirectory.... neviete niekto ako sa da aby
bol uz
nejaky konkretny adresar vybrany ..... zmenou parametra root iba
obmedzim
vyberovu strukturu a to nechcem
alebo nejaky vhodnejsi sposob (komponentu) vyberu adresaru ale musi
tam byt
k dispozicii aj siet
Rickie
Odpovedá: Ondrej Kelle
26. 9. 2002 11:50
> ked je uz debata o SelectDirectory.... neviete niekto ako sa
> da aby bol uz nejaky konkretny adresar vybrany
V tom dialogu bude vopred nastavena cesta, ktoru predas pri volani
SelectDirectory v parametri Directory.
> ale musi tam byt k dispozicii aj siet
To tam je tiez.
HTH
TOndrej
Odpovedá: Richard Siegl
26. 9. 2002 15:09
Perfektne ..... mozem ten unit pouzit free .. aj do komercnej aplikacie ???
Rickie
PS : urobil som si upravu ze ked je init dir sietovy tak ho neberiem do
uvahy
----- Original Message -----
From: "Petr Brant" <brant@dcomm.cz>
To: <delphi-l@clexpert.cz>
Sent: Thursday, September 26, 2002 11:04 AM
Subject: RE: SelectDirectory - umiestnenie
Napsal jsem si na to tenhle unit, je tam k dispozici i sit (ale nezobrazi se
sitovy adresar, i kdyz existuje) a pokud existuje adresar InitialDirectory,
struktura se prislusne rozbali.
RNDr. Petr Brant [brant@dcomm.cz]
http://web.redbox.cz/petr.brant
D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234
unit BrowseDir;
interface
uses
Windows,
ShlObj, SysUtils, FileCtrl;
type TBrowseDirectory = class(TObject)
private
{ Private declarations }
public
{ Public declarations }
function BrowseForDirectory(OwnerWnd:THandle; InitialDirectory: string; var
SelectedDirectory:string):boolean;
end;
implementation
uses ActiveX;
var m_InitialDirectory:string;
function BrowseCallbackProc(Wnd: HWnd; Msg: UINT; lPar: LPARAM; lData:
LPARAM): integer; stdcall;
begin
Result := 0;
if (Msg = BFFM_INITIALIZED) and DirectoryExists(m_InitialDirectory) then
SendMessage(Wnd, BFFM_SETSELECTION, 1, LPARAM(m_InitialDirectory) );
end;
function TBrowseDirectory.BrowseForDirectory(OwnerWnd:THandle;
InitialDirectory: string; var SelectedDirectory:string):boolean;
var BrowseInfo: TBrowseInfo;
idRoot: PItemIDList;
Dir: PChar;
ShellMalloc: IMalloc;
begin
FillChar(BrowseInfo, SizeOf(BrowseInfo), 0);
if (ShGetMalloc(ShellMalloc) = S_OK) and (ShellMalloc <> nil) then
begin
Dir:= ShellMalloc.Alloc(MAX_PATH);
try
m_InitialDirectory:=InitialDirectory;
BrowseInfo.hwndOwner:=OwnerWnd;
BrowseInfo.pidlRoot:=idRoot;
BrowseInfo.lpszTitle:='';
BrowseInfo.ulFlags:= BIF_RETURNONLYFSDIRS;
BrowseInfo.lpfn:=BrowseCallbackProc;
BrowseInfo.pszDisplayName:=Dir;
idRoot:=ShBrowseForFolder(BrowseInfo);
Result:=false;
if idRoot<>nil then
begin
SHGetPathFromIDList(idRoot, Dir);
SelectedDirectory:=string(Dir);
ShellMalloc.Free(idRoot);
Result:=(Length(SelectedDirectory)<>0);
end;
finally
ShellMalloc.Free(Dir);
end;
end;
end;
end.
Subject: Re: SelectDirectory - umiestnenie
Nazdar
ked je uz debata o SelectDirectory.... neviete niekto ako sa da aby
bol uz
nejaky konkretny adresar vybrany ..... zmenou parametra root iba
obmedzim
vyberovu strukturu a to nechcem
alebo nejaky vhodnejsi sposob (komponentu) vyberu adresaru ale musi
tam byt
k dispozicii aj siet
Rickie
Odpovedá: Richard Siegl
26. 9. 2002 13:51
tak to urcite nie .... to bola prva vec co ma napadla ale nefunguje,
je zajedno ci je v parametry directory nieco nastavene alebo nie vzdy
zobrazi
Rickie
(pouzivam D5 Ent SP1)
----- Original Message -----
From: "Ondrej Kelle" <O.Kelle@digitalpublishing.de>
To: <delphi-l@clexpert.cz>
Sent: Thursday, September 26, 2002 11:32 AM
Subject: RE: SelectDirectory - umiestnenie
> > ked je uz debata o SelectDirectory.... neviete niekto ako sa
> > da aby bol uz nejaky konkretny adresar vybrany
>
> V tom dialogu bude vopred nastavena cesta, ktoru predas pri volani
> SelectDirectory v parametri Directory.
>
> > ale musi tam byt k dispozicii aj siet
>
> To tam je tiez.
>
> HTH
> TOndrej
>
Odpovedá: Ondrej Kelle
26. 9. 2002 16:12
>> V tom dialogu bude vopred nastavena cesta, ktoru predas pri volani
>> SelectDirectory v parametri Directory.
> tak to urcite nie .... to bola prva vec co ma napadla ale nefunguje,
> je zajedno ci je v parametry directory nieco nastavene alebo nie vzdy
> zobrazi
Ak si vsimnes ten riadok v SelectDirCB, co som posielal:
if (lpData <> 0) then
SendMessage(Wnd, BFFM_SETSELECTION, Integer(True), lpData);
tam sa to prave deje. Do callbacku sa ako lpData dostane to, co zadas v
TBrowseInfo.lParam.
Takze v SelectDirectory by si tam mal dat PChar(Directory) a callback potom
zariadi, aby bola ta cesta v dialogu pocas jeho inicializacie vybrana. U mna
to v SelectDirectory vyzera takto:
...
if not DirectoryExists(Directory) then
Directory := '';
...
with BrowseInfo do
begin
...
if Directory <> '' then
lParam := PChar(Directory);
end;
...
> (pouzivam D5 Ent SP1)
Ja pouzivam D6 a tam to uz je. Ak to v D5 nemas, mozes si to tam dopisat.
HTH
TOndrej
Odpovedá: Petr Brant
26. 9. 2002 16:31
No jasne... polovina je opsana odnekud z UDDF a druha ze zdrojaku VCL, neco
je taky z nejakeho Cckoveho programu, ne ze bych to vymyslel kompletne cele,
zase tak dobrej nejsem
RNDr. Petr Brant [brant@dcomm.cz]
D&COMM s.r.o.
Korunovační 6
Praha 7
tel. +420724007234
Subject: Re: SelectDirectory - umiestnenie
Perfektne ..... mozem ten unit pouzit free .. aj do komercnej
aplikacie ???
Rickie
PS : urobil som si upravu ze ked je init dir sietovy tak ho neberiem
do
uvahy